const { app } = require('electron')
const { ipcMain } = require('electron')
const Store = require('electron-store')
import { createNoteWindow } from './windowManager'
const store = new Store()

export function ipcHandles(mainWindow) {
  let noteWindowsArr = []
  let noteWindowsParamsArr = []

  // 存储数据初始化
  app.whenReady().then(() => {
    // 判断本地存储中是否有东西
    if (store.has('noteWindowsParamsArr')) {
      noteWindowsParamsArr = store.get('noteWindowsParamsArr')
      noteWindowsParamsArr.forEach((item) => {
        noteWindowsArr.push({ id: item.id, noteWindow: null })
      })
    }
  })

  // 监听关闭窗口事件
  ipcMain.on('mainWindow:hide', () => {
    mainWindow.hide()
  })

  // 监听存储数据
  ipcMain.on('store:set', (_, key, val) => {
    let value
    try {
      value = JSON.parse(val)
    } catch (error) {
      value = val
    }
    store.set(key, value)
  })

  // 监听获取数据
  ipcMain.on('store:get', (_, key) => {
    let value = store.get(key)
    _.returnValue = value || ''
  })

  // 监听主题的变化
  store.onDidChange('theme', (newVal) => {
    // 发送消息给渲染进程
    mainWindow.webContents.send('theme:change', newVal)
    // 发送消息给所有的子窗口
    noteWindowsArr.forEach((item) => {
      // 当窗口关闭的时候就不需要再去发送信息
      if (!item.noteWindow?.isDestroyed() && item.noteWindow !== null) {
        item.noteWindow.webContents.send('theme:change', newVal)
      }
    })
  })

  // 监听创建笔记窗口
  ipcMain.on('noteWindow:create', (_, len) => {
    /**
     * noteParams 对象用于定义笔记窗口的参数。
     * @property {number} id - 笔记窗口的唯一标识符。
     * @property {string} content - 笔记的内容。
     * @property {string} theme - 笔记的主题颜色。
     * @property {number} createTime - 笔记创建的时间戳。
     * @property {number} updateTime - 笔记最后更新的时间戳。
     */
    const noteWindowsParams = {
      id: len,
      content: '',
      theme: 'yellow',
      createTime: new Date().getTime(),
      updateTime: new Date().getTime()
    }

    const theme = store.get('theme') == undefined ? 'light' : store.get('theme')
    const noteWindow = createNoteWindow(len, theme, 'yellow')
    noteWindowsParamsArr = store.get('noteWindowsParamsArr') || []

    // 存储属性
    noteWindowsParamsArr.push(noteWindowsParams)
    // 存储窗口
    noteWindowsArr.push({ id: len, noteWindow })
    // 本地存储设置
    store.set('noteWindowsParamsArr', noteWindowsParamsArr)
  })

  // 监听关闭笔记窗口
  ipcMain.on('noteWindow:close', (_, noteId) => {
    // 寻找对应的子窗口
    const matchIngNoteWindow = noteWindowsArr.find((note) => {
      return note.id == noteId
    })
    // 检查窗口是否已经被销毁
    if (matchIngNoteWindow && !matchIngNoteWindow.noteWindow.isDestroyed()) {
      matchIngNoteWindow.noteWindow.close()
    }
    // 判断窗口内容是否为空
    const matchIngNoteWindowParams = noteWindowsParamsArr.find((note) => {
      return note.id == noteId
    })
    if (matchIngNoteWindowParams && matchIngNoteWindowParams.content == '') {
      // 删除数组中的属性和窗口
      noteWindowsParamsArr = noteWindowsParamsArr.filter((noteParam) => {
        return noteParam.id != noteId
      })
      noteWindowsArr = noteWindowsArr.filter((note) => note.id != noteId)
      // 删除本地存储中的笔记
      store.set('noteWindowsParamsArr', noteWindowsParamsArr)
    }
  })

  // 本地存储监听 noteWindowsParamsArr 的变化
  store.onDidChange('noteWindowsParamsArr', (newVal) => {
    // 发送消息给渲染进程
    mainWindow.webContents.send('noteWindow:change', newVal)
  })

  // 监听抽屉的状态
  ipcMain.on('drawerActive:change:js', (_, noteId) => {
    // 寻找对应的子窗口
    const matchIngNoteWindow = noteWindowsArr.find((note) => {
      return note.id == noteId
    })
    // 发消息给笔记组件
    matchIngNoteWindow.noteWindow.webContents.send('drawerActive:change:vue')
  })

  // 监听子窗口改变笔记颜色
  ipcMain.on('colorTheme:change:js', (_, noteId, colorName) => {
    // 发送消息给主窗口
    mainWindow.webContents.send('colorTheme:change:vue', noteId, colorName)

    // 寻找对应的子窗口
    const matchIngNoteWindow = noteWindowsArr.find((note) => {
      return note.id == noteId
    })

    // 寻找对应的子窗口属性
    const matchIngNoteWindowParams = noteWindowsParamsArr.find((noteParam) => {
      return noteParam.id == noteId
    })
    // 修改笔记主题颜色
    matchIngNoteWindowParams.theme = colorName

    // 发送消息给子窗口的头部操作栏
    matchIngNoteWindow.noteWindow.webContents.send('colorTheme:change:vue', colorName)
  })

  // 监听打开子窗口笔记
  ipcMain.on('noteWindow:show', (_, noteId) => {
    const theme = store.get('theme') == undefined ? 'light' : store.get('theme')
    // 寻找对应的子窗口
    const matchIngNoteWindow = noteWindowsArr.find((note) => {
      return note.id == noteId
    })
    // 寻找对应的子窗口属性
    const matchIngNoteWindowParams = noteWindowsParamsArr.find((noteParam) => {
      return noteParam.id == noteId
    })
    // 判断窗口的状态
    if (matchIngNoteWindow.noteWindow?.isDestroyed() || matchIngNoteWindow.noteWindow == null) {
      /**
       * 窗口销毁
       * 创建新的子窗口
       * 将 noteWindowsArr 中对应的子窗口进行替代
       */
      const noteWindow = createNoteWindow(
        matchIngNoteWindowParams.id,
        theme,
        matchIngNoteWindowParams.theme
      )

      matchIngNoteWindow.noteWindow = noteWindow
    } else if (!matchIngNoteWindow.noteWindow.isFocused()) {
      // 判断窗口是否置于焦点
      matchIngNoteWindow.noteWindow.focus()
    }
  })

  // 监听改变笔记内容
  ipcMain.on('content:change:js', (_, noteId, content) => {
    /**
     * 在本地保存
     * 发送事件给笔记列表
     */
    // 寻找对应的子窗口属性
    const matchIngNoteWindowParams = noteWindowsParamsArr.find((noteParam) => {
      return noteParam.id == noteId
    })
    // 修改笔记主题颜色
    matchIngNoteWindowParams.content = content
    store.set('noteWindowsParamsArr', noteWindowsParamsArr)

    // mainWindow.webContents.send('note:change:vue', noteId, content)
  })

  // 监听窗口置顶
  ipcMain.on('window:alignTop', (_, noteId, isAlignTopFlag) => {
    // 判断是主窗口还是笔记窗口
    if (noteId === '-1') {
      mainWindow.setAlwaysOnTop(isAlignTopFlag)
      console.log(mainWindow.isAlwaysOnTop())
    } else {
      const matchIngNoteWindow = noteWindowsArr.find((note) => {
        return note.id == noteId
      })

      matchIngNoteWindow.noteWindow.setAlwaysOnTop(isAlignTopFlag)
    }
  })

  // 监听删除笔记
  ipcMain.on('note:delete', (_, noteId) => {
    const matchIngNoteWindow = noteWindowsArr.find((note) => {
      return note.id == noteId
    })
    // 检查窗口是否已经被销毁
    if (matchIngNoteWindow && !matchIngNoteWindow.noteWindow.isDestroyed()) {
      matchIngNoteWindow.noteWindow.close()
    }
    // 删除数组中的属性和窗口
    noteWindowsParamsArr = noteWindowsParamsArr.filter((noteParam) => {
      return noteParam.id != noteId
    })
    noteWindowsArr = noteWindowsArr.filter((note) => note.id != noteId)
    // 删除本地存储中的笔记
    store.set('noteWindowsParamsArr', noteWindowsParamsArr)
  })

  // 监听主窗口显示事件
  ipcMain.on('mainWindow:show', () => {
    if (mainWindow) {
      if (mainWindow.isMinimized()) {
        // 如果窗口被最小化了，恢复窗口
        mainWindow.restore()
      } else if (!mainWindow.isVisible()) {
        // 如果窗口被隐藏了，显示窗口
        mainWindow.show()
      } else {
        // 如果窗口已经是可见的，仅给予焦点
        mainWindow.focus()
      }
    }
  })

  // 监听搜索内容改变事件
  ipcMain.on('searchContent:change:js', (_, con) => {
    // 从属性数组中的内容全部进行排查是否含有该内容
    const matchArr = noteWindowsParamsArr.filter((noteParam) => {
      return noteParam.content.includes(con)
    })
    // 将筛选后的数组返回给渲染进程
    mainWindow.webContents.send('searchContent:change:vue', matchArr)
  })
}
